#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>                         // 包含用于文件操作的类
#include <QMessageBox>
#include <QRandomGenerator>              // 包含用于随机数生成的类
#include "admsql.h"
#include "page_login.h" // 确保包含 Page_login 的头文件
#include <QDir>
// 构造函数：创建主窗口实例，并初始化界面和其他资源。
const std::set<int> MainWindow::sortableColumns = {1, 2, 4, 5,6}; // 假设学号、年龄、年级、班级是可以排序的
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_ptrStuSql(nullptr)
    , m_admSql(new AdmSql(this))
    , m_passwordDialog(nullptr)
{
    ui->setupUi(this);
    // 显示登录对话框
    // setStyle();
    m_dlgLogin.show();
    // 定义一个 lambda 表达式用于处理登录成功或注册成功的事件
    auto f = [&](){
        this->show();
    };

    // 连接登录和注册成功的信号到槽函数
    connect(&m_dlgLogin, &Page_login::sendLoginSuccess, this, f);
    connect(&m_dlgLogin, &Page_login::sendEnrolSuccess, this, f);
    connect(&m_dlgLogin, &Page_login::sendLoginSuccess, this, &MainWindow::updateAdminInfoLabels);
    // 连接 Dialog_password 的信号到 MainWindow 的槽
    connect(m_passwordDialog, &Dialog_password::adminInfoChanged, this, &MainWindow::onAdminInfoChanged);
    connect(&m_dlgLogin, &Page_login::pagetologin, [=]() {
        qDebug() << "Switching to login page.";
        // 切换到登录页面的逻辑
    });

    connect(&m_dlgLogin, &Page_login::pagetoenrol, [=]() {
        qDebug() << "Switching to enrollment page.";
        // 切换到注册页面的逻辑
    });


    // 设置树形控件的列数为1
    ui->treeWidget->clear();
    ui->treeWidget->setColumnCount(1);

    // 创建根节点 "人员管理系统"
    QTreeWidgetItem *pf = new QTreeWidgetItem(ui->treeWidget, QStringList("人员管理系统"));

    // 添加子节点到根节点
    ui->treeWidget->addTopLevelItem(pf);
    QTreeWidgetItem *p1 = new QTreeWidgetItem(pf, QStringList("学生管理"));
    QTreeWidgetItem *p2 = new QTreeWidgetItem(pf, QStringList("管理员管理"));
    QTreeWidgetItem *p3 = new QTreeWidgetItem(pf, QStringList("个人中心"));

    // 将子节点添加到根节点中
    pf->addChild(p1);
    pf->addChild(p2);
    pf->addChild(p3);

    // 默认展开所有节点
    ui->treeWidget->expandAll();
    ui->stackedWidget->setCurrentIndex(0);
    // 连接 treeWidget 的 itemClicked 信号到槽函数
    connect(ui->treeWidget, &QTreeWidget::itemClicked, this, &MainWindow::onTreeWidgetItemClicked);

    // 获取 stuSql 单例对象实例，并调用 init() 方法初始化数据库连接
    m_ptrStuSql = stuSql::getInstance();
    m_ptrStuSql->init();
    // 清空名字列表
    m_names.clear();
    QFile f1;
    auto str = QCoreApplication::applicationDirPath();
    // 使用双反斜杠 \\ 或正斜杠 / 作为文件路径分隔符
    f1.setFileName("names.txt");
    if (f1.open(QIODevice::ReadOnly)) {
        if (readNamesFromFile(m_names, f1.fileName())) {
            qDebug() << "成功读取文件，内容为：" << m_names;
        } else {
            qDebug() << "读取文件失败";
        }
        f1.close();
    } else {
        qDebug() << "打开文件失败: " << f1.errorString();
    }
    showStudentInformation();
    // 设置初始显示页面（可选）
    ui->stackedWidget->setCurrentWidget(page_student); // 或者其他页面

    // // 设置按钮到列索引的映射
    // buttonToColumnMap[ui->pb_id] = 1;
    // buttonToColumnMap[ui->pb_sid] = 2;
    // buttonToColumnMap[ui->pb_age] = 4;
    // buttonToColumnMap[ui->pb_grade] = 5;
    // buttonToColumnMap[ui->pb_class] = 6;

    // // 设置按钮到初始排序信息的映射，并设置初始图标
    // buttonToSortInfoMap[ui->pb_id] = {Qt::AscendingOrder, ":/resource/down.png", ":/resource/up.png"};
    // buttonToSortInfoMap[ui->pb_sid] = {Qt::AscendingOrder, ":/resource/down.png", ":/resource/up.png"};
    // buttonToSortInfoMap[ui->pb_age] = {Qt::AscendingOrder, ":/resource/down.png", ":/resource/up.png"};
    // buttonToSortInfoMap[ui->pb_grade] = {Qt::AscendingOrder, ":/resource/down.png", ":/resource/up.png"};
    // buttonToSortInfoMap[ui->pb_class] = {Qt::AscendingOrder, ":/resource/down.png", ":/resource/up.png"};

    // 禁用用户直接通过点击表头来排序
    ui->tableWidget->setSortingEnabled(false);
    // 初始化行号
    updateRowNumbers();
    // 禁用用户直接通过点击表头来排序
    ui->tableWidget->setSortingEnabled(false);
    // 初始化行号
    updateRowNumbers();
    // 连接表头点击信号到槽函数
    connect(ui->tableWidget->horizontalHeader(), &QHeaderView::sectionClicked, this, &MainWindow::onHeaderSectionClicked);

    // for (auto it = buttonToColumnMap.begin(); it != buttonToColumnMap.end(); ++it) {
    //     it.key()->setIcon(QIcon());
    //     it.key()->setStyleSheet("");
    // }
}

MainWindow::~MainWindow()
{
    delete ui;
    delete m_admSql;
}

void MainWindow::onTreeWidgetItemClicked(QTreeWidgetItem *item, int column)
{
    if (item && item->text(column) == "管理员管理") {
        // 切换到管理员管理页面
        ui->stackedWidget->setCurrentIndex(1);
        showAdminInformation();
    } else if(item && item->text(column) == "学生管理") {
        // 切换到学生管理页面
        ui->stackedWidget->setCurrentIndex(0);
    } else if(item && item->text(column) == "个人中心") {
        // 切换到个人中心页面
        ui->stackedWidget->setCurrentIndex(2);
    }
}

// void MainWindow::setStyle()
// {
//     QFile f;
//     auto str=QCoreApplication::applicationDirPath();
//     f.setFileName(str+"//"+"stuqss.css");
//     f.open(QIODevice::ReadOnly);
//     QString strQss = f.readAll();
//     this->setStyleSheet(strQss);
//     m_dlgLogin.setStyleSheet(strQss);
// }

// 当退出按钮被点击时调用此槽函数，终止应用程序。
void MainWindow::on_pb_exit_clicked()
{
    exit(0);                            // 终止应用程序，返回状态码 0 表示正常退出
}

// 当模拟按钮被点击时调用此槽函数，用于生成模拟的学生数据。
void MainWindow::on_pb_simulation_clicked()
{
    // ui->pb_simulation->setEnabled(false); // 禁用按钮以防止重复点击
    QRandomGenerator g, c;                // 创建两个随机数生成器
    g.seed(0);                            // 使用固定的种子值初始化第一个随机数生成器，确保每次运行结果一致
    c.seed(0);                            // 使用固定的种子值初始化第二个随机数生成器

    // 制作一定数量的学生数据，数量等于 m_names 的大小
    for (int i = 0; i < m_names.size(); ++i) {
        auto grade = g.bounded(1, 7);     // 随机生成年级，范围是 [1, 6]
        auto sclass = c.bounded(1, 9);    // 随机生成班级，范围是 [1, 8]

        StuInfo info;                     // 创建一个 StuInfo 结构体实例
        info.sname = m_names[i];          // 设置学生姓名为从文件读取的名字列表中的第 i 个名字

        // 根据年级随机生成年龄，范围是 [年级 + 5, 年级 + 6]，即一年级对应 [6, 7] 岁，以此类推
        int baseAge = grade + 5;
        info.age = g.bounded(baseAge, baseAge + 2);

        // 设置学号为51开头，并根据年级动态生成后缀
        QString sidPrefix = QString("5120%1").arg(26 - grade, 2, 10, QChar('0')); // 例如：一年级 -> 512025
        info.sid = QString("%1%2").arg(sidPrefix).arg(i, 3, 10, QChar('0')); // 学号后三位是索引 `i`，不足三位补0

        info.grade = grade;               // 设置年级
        info.sclass = sclass;             // 设置班级

        // 生成随机的正常电话号码，确保以1开头，总共11位数字
        QString phone = "1";
        for (int j = 0; j < 10; ++j) {
            phone.append(QString::number(g.bounded(0, 10)));
        }
        info.phone = phone;

        m_ptrStuSql->addStu(info);        // 将构造好的学生信息添加到数据库中
    }
    showStudentInformation();
}


// 从文件读取名字列表，并将其存储在提供的 QStringList 中。
bool MainWindow::readNamesFromFile(QStringList &names, const QString &filePath)
{
    QFile file(filePath);               // 创建一个 QFile 对象，关联到指定路径的文件
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { // 尝试以只读文本模式打开文件
        qDebug() << "无法打开文件以读取:" << filePath; // 如果打开失败，打印错误信息
        return false;                    // 返回 false 表示读取失败
    }

    QTextStream in(&file);              // 创建一个 QTextStream 对象，关联到文件
    while (!in.atEnd()) {               // 遍历文件每一行
        QString line = in.readLine();   // 读取一行文本
        if (!line.isEmpty()) {          // 忽略空行
            names.append(line.trimmed()); // 去除首尾空白字符后添加到名字列表中
        }
    }

    file.close();                       // 关闭文件
    return true;                        // 返回 true 表示读取成功
}

void MainWindow::on_pb_add_clicked()
{
    m_dlgAddStu.setType(true);
    // m_dlgAddStu.exec();//模态
    // 模态对话框，等待用户完成操作
    if (m_dlgAddStu.exec() == QDialog::Accepted) {
        // 如果对话框返回 Accepted，则表示用户成功提交了数据
        QMessageBox::information(this, tr("成功"), tr("学生信息添加成功！"));
    }
    showStudentInformation();
}


void MainWindow::on_pb_clear_clicked()
{
    // 确认用户是否真的想要清除所有学生信息
    int ret = QMessageBox::warning(this, tr("确认清除"),
                                   tr("您确定要清除所有学生信息吗？此操作不可逆！"),
                                   QMessageBox::Yes | QMessageBox::No,
                                   QMessageBox::No);

    if (ret == QMessageBox::Yes) {
        // 用户确认清除
        bool success = m_ptrStuSql->clearStu();
        if (success) {
            QMessageBox::information(this, tr("成功"), tr("所有学生信息已清除！"));
        } else {
            QMessageBox::critical(this, tr("清除失败"), tr("清除学生信息时发生错误，请稍后再试。"));
        }
    }
    showStudentInformation();
}

void MainWindow::showStudentInformation()
{
    // for (auto it = buttonToColumnMap.begin(); it != buttonToColumnMap.end(); ++it) {
    //     it.key()->setIcon(QIcon());
    //     it.key()->setStyleSheet("");
    // }
    ui->tableWidget->verticalHeader()->setVisible(false);
    ui->tableWidget->clear();
    ui->tableWidget->setColumnCount(8);
    QStringList l;
    l<<"序号"<<"ID"<<"学号"<<"姓名"<<"年龄"<<"年级"<<"班级"<<"电话";
    ui->tableWidget->setHorizontalHeaderLabels(l);
    //只选中行
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    // ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
    ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

    auto cnt=m_ptrStuSql->getStuCnt();
    ui->l_cnt->setText(QString("学生总数：%1").arg(cnt));
    QList<StuInfo>lstudents=m_ptrStuSql->getPageStu(0,cnt);
    ui->tableWidget->setRowCount(cnt);
    for(int i=0;i<lstudents.size();i++){
        ui->tableWidget->setItem(i,0,new QTableWidgetItem(QString::number(i)));
        ui->tableWidget->setItem(i,1,new QTableWidgetItem(QString::number(lstudents[i].id)));
        ui->tableWidget->setItem(i,2,new QTableWidgetItem(lstudents[i].sid));
        ui->tableWidget->setItem(i,3,new QTableWidgetItem(lstudents[i].sname));
        ui->tableWidget->setItem(i,4,new QTableWidgetItem(QString::number(lstudents[i].age)));
        ui->tableWidget->setItem(i,5,new QTableWidgetItem(QString::number(lstudents[i].grade)));
        ui->tableWidget->setItem(i,6,new QTableWidgetItem(QString::number(lstudents[i].sclass)));
        ui->tableWidget->setItem(i,7,new QTableWidgetItem(lstudents[i].phone));
    }
    if (ui->cb_select->checkState() == Qt::Checked) { ui->cb_select->setCheckState(Qt::Unchecked); }
}

void MainWindow::showAdminInformation()
{
    // 设置表格属性
    ui->tableWidget_admin->verticalHeader()->setVisible(false);
    ui->tableWidget_admin->clear();
    ui->tableWidget_admin->setColumnCount(4); // 管理员信息只有4个字段
    QStringList headerLabels;
    headerLabels << "序号" << "账户" << "账户名" << "邮箱";
    ui->tableWidget_admin->setHorizontalHeaderLabels(headerLabels);

    // 只选中行
    ui->tableWidget_admin->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->tableWidget_admin->setEditTriggers(QAbstractItemView::NoEditTriggers);

    // 获取所有管理员数据
    QList<AdmInfo> admins = m_admSql->getAllAdm();

    // 设置表格的行数
    ui->tableWidget_admin->setRowCount(admins.size());

    // 遍历管理员数据列表，并填充表格
    for (int row = 0; row < admins.size(); ++row) {
        const AdmInfo &admin = admins[row];
        QTableWidgetItem *indexItem = new QTableWidgetItem(QString::number(row + 1));
        QTableWidgetItem *idItem = new QTableWidgetItem(admin.aid);
        QTableWidgetItem *nameItem = new QTableWidgetItem(admin.aname);
        QTableWidgetItem *emailItem = new QTableWidgetItem(admin.email);

        // 将每一项添加到对应的单元格
        ui->tableWidget_admin->setItem(row, 0, indexItem);
        ui->tableWidget_admin->setItem(row, 1, idItem);
        ui->tableWidget_admin->setItem(row, 2, nameItem);
        ui->tableWidget_admin->setItem(row, 3, emailItem);
    }
}

void MainWindow::on_pb_update_clicked()
{
    int currentRow = ui->tableWidget->currentRow();

    if (currentRow < 0) {
        // 如果没有选中任何行，则提示用户选择一行
        QMessageBox::warning(this, tr("警告"), tr("请先选择要更新的学生信息！"));
        return;
    }

    StuInfo info;

    // 获取当前选中行的数据
    QTableWidgetItem *idItem = ui->tableWidget->item(currentRow, 1);
    QTableWidgetItem *sidItem = ui->tableWidget->item(currentRow, 2);
    QTableWidgetItem *snameItem = ui->tableWidget->item(currentRow, 3);
    QTableWidgetItem *ageItem = ui->tableWidget->item(currentRow, 4);
    QTableWidgetItem *gradeItem = ui->tableWidget->item(currentRow, 5);
    QTableWidgetItem *classItem = ui->tableWidget->item(currentRow, 6);
    QTableWidgetItem *phoneItem = ui->tableWidget->item(currentRow, 7);

    // 将表格中的数据填充到 StuInfo 结构体中
    info.id = idItem->text().toUInt();
    info.sid = sidItem->text();
    info.sname = snameItem->text();
    info.age = ageItem->text().toUInt();
    info.grade = gradeItem->text().toUInt();
    info.sclass = classItem->text().toUInt();
    info.phone = phoneItem->text();

    // 设置对话框为编辑模式，并传递学生信息
    m_dlgAddStu.setType(false, info);

    // 模态对话框，等待用户完成操作
    if (m_dlgAddStu.exec() == QDialog::Accepted) {
        // 如果对话框返回 Accepted，则表示用户成功提交了数据
        QMessageBox::information(this, tr("成功"), tr("学生信息更新成功！"));
    }
    showStudentInformation();
}


void MainWindow::on_pb_search_clicked()
{
    // 获取用户输入的查询条件
    QString searchStr = ui->le_search->text().trimmed();
    if (searchStr.isEmpty()) {
        QMessageBox::warning(this, "警告", "请输入查询条件！");
        return;
    }

    // 判断是按学号还是按姓名查询
    bool isSidSearch = searchStr.startsWith("5120");

    // 使用 stuSql 进行查询
    auto ptr = stuSql::getInstance();
    QVector<StuInfo> results = ptr->searchStu(searchStr, isSidSearch);

    // 清空表格并设置表头
    ui->tableWidget->clearContents();
    ui->tableWidget->setRowCount(0);
    ui->tableWidget->setColumnCount(8); // 假设有7列

    // 设置表头标签（根据实际情况调整）
    QStringList headers;
    headers << "序号"<< "ID" << "学号" << "姓名" << "年龄" << "年级" << "班级" << "电话";
    ui->tableWidget->setHorizontalHeaderLabels(headers);

    int row = 0;
    for (const StuInfo& info : results) {
        ui->tableWidget->insertRow(row);

        // 创建 QTableWidgetItem 对象
        QTableWidgetItem *item_seq = new QTableWidgetItem(QString::number(row + 1)); // 序号从1开始
        QTableWidgetItem *item_id = new QTableWidgetItem(QString::number(info.id));
        QTableWidgetItem *item_sid = new QTableWidgetItem(info.sid);
        QTableWidgetItem *item_sname = new QTableWidgetItem(info.sname);
        QTableWidgetItem *item_age = new QTableWidgetItem(QString::number(info.age));
        QTableWidgetItem *item_grade = new QTableWidgetItem(QString::number(info.grade));
        QTableWidgetItem *item_class = new QTableWidgetItem(QString::number(info.sclass));
        QTableWidgetItem *item_phone = new QTableWidgetItem(info.phone);

        // 插入查询结果到表格中
        ui->tableWidget->setItem(row, 0, item_seq);  // 序号
        ui->tableWidget->setItem(row, 1, item_id);   // ID
        ui->tableWidget->setItem(row, 2, item_sid);  // 学号
        ui->tableWidget->setItem(row, 3, item_sname); // 姓名
        ui->tableWidget->setItem(row, 4, item_age);  // 年龄
        ui->tableWidget->setItem(row, 5, item_grade); // 年级
        ui->tableWidget->setItem(row, 6, item_class); // 班级
        ui->tableWidget->setItem(row, 7, item_phone); // 电话

        ++row;
    }

    if (results.isEmpty()) {
        QMessageBox::warning(this, "警告", "未找到匹配的学生记录！");
        showStudentInformation();
    }
}


void MainWindow::on_pb_del_clicked()
{
    // 获取所有选中的行
    QList<int> selectedRows;
    for (int row = 0; row < ui->tableWidget->rowCount(); ++row) {
        QTableWidgetItem *item = ui->tableWidget->item(row, 0); // 获取复选框所在的列
        if (item && item->checkState() == Qt::Checked) {
            selectedRows.append(row);
        }
    }

    if (selectedRows.isEmpty()) {
        QMessageBox::warning(this, "警告", "请选择要删除的记录！");
        return;
    }

    // 提示用户确认删除
    int ret = QMessageBox::question(this, "确认删除", "确定要删除选中的记录吗？",
                                    QMessageBox::Yes | QMessageBox::No);
    if (ret != QMessageBox::Yes) {
        return;
    }

    // 按照从大到小的顺序删除，避免索引变化影响
    std::sort(selectedRows.begin(), selectedRows.end(), std::greater<int>());

    auto ptr = stuSql::getInstance();

    for (int row : selectedRows) {
        QTableWidgetItem *idItem = ui->tableWidget->item(row, 1); // 假设ID在第1列
        if (idItem) {
            unsigned int id = idItem->text().toUInt();
            if (!ptr->delStu(id)) {
                QMessageBox::critical(this, "错误", "删除失败！");
                return;
            }
        }
        ui->tableWidget->removeRow(row);
    }

    QMessageBox::information(this, "成功", "删除成功！");
    showStudentInformation();
}


void MainWindow::on_cb_select_checkStateChanged(const Qt::CheckState &arg1)
{
    if (arg1 == Qt::Checked) {
        // 设置列名
        QStringList headers;
        headers << "选择" <<  "ID" << "学号" << "姓名" << "年龄" << "年级" << "班级" << "电话";
        ui->tableWidget->setHorizontalHeaderLabels(headers);
        // 如果 cb_select 被勾选，则为每一行添加一个默认未勾选的复选框
        for (int row = 0; row < ui->tableWidget->rowCount(); ++row) {
            QTableWidgetItem *checkboxItem = new QTableWidgetItem();
            checkboxItem->setCheckState(Qt::Unchecked);
            ui->tableWidget->setItem(row, 0, checkboxItem); // 复选框放在第0列
        }
    } else {
        // 如果 cb_select 没有被勾选，则移除所有行的复选框项
        for (int row = 0; row < ui->tableWidget->rowCount(); ++row) {
            ui->tableWidget->takeItem(row, 0); // 移除第0列的复选框项
        }
        showStudentInformation();
    }
}
void MainWindow::populateTable()
{
    // 清空表格
    ui->tableWidget->clearContents();
    ui->tableWidget->setRowCount(0);

    // 设置列名
    QStringList headers;
    headers << "选择" <<  "ID" << "学号" << "姓名" << "年龄" << "年级" << "班级" << "电话";
    ui->tableWidget->setHorizontalHeaderLabels(headers);

    // 获取学生总数并更新显示
    int cnt = m_ptrStuSql->getStuCnt();
    ui->l_cnt->setText(QString("学生总数：%1").arg(cnt));

    // 获取分页的学生信息
    QList<StuInfo> lstudents = m_ptrStuSql->getPageStu(0, cnt);

    int row = 0;
    for (const StuInfo& info : lstudents) {
        ui->tableWidget->insertRow(row);

        // 根据 cb_select 的状态决定是否创建复选框项
        if (ui->cb_select->checkState() == Qt::Checked) {
            QTableWidgetItem *checkboxItem = new QTableWidgetItem();
            checkboxItem->setCheckState(Qt::Unchecked);
            ui->tableWidget->setItem(row, 0, checkboxItem); // 复选框放在第0列
        }

        // 插入其他数据项
        QTableWidgetItem *item_seq = new QTableWidgetItem(QString::number(row + 1)); // 序号从1开始
        QTableWidgetItem *item_id = new QTableWidgetItem(QString::number(info.id));
        QTableWidgetItem *item_sid = new QTableWidgetItem(info.sid);
        QTableWidgetItem *item_sname = new QTableWidgetItem(info.sname);
        QTableWidgetItem *item_age = new QTableWidgetItem(QString::number(info.age));
        QTableWidgetItem *item_grade = new QTableWidgetItem(QString::number(info.grade));
        QTableWidgetItem *item_class = new QTableWidgetItem(QString::number(info.sclass));
        QTableWidgetItem *item_phone = new QTableWidgetItem(info.phone);

        // 设置表单项，注意序号现在应该放在第1列
        ui->tableWidget->setItem(row, 1, item_seq);  // 序号
        ui->tableWidget->setItem(row, 2, item_id);   // ID
        ui->tableWidget->setItem(row, 3, item_sid);  // 学号
        ui->tableWidget->setItem(row, 4, item_sname); // 姓名
        ui->tableWidget->setItem(row, 5, item_age);  // 年龄
        ui->tableWidget->setItem(row, 6, item_grade); // 年级
        ui->tableWidget->setItem(row, 7, item_class); // 班级
        ui->tableWidget->setItem(row, 8, item_phone); // 电话

        ++row;
    }
}
void MainWindow::on_pb_password_clicked()
{
    // 获取当前管理员信息
    AdmInfo currentAdmin = getCurrentAdmin();

    // 输出当前管理员的信息用于调试
    qDebug() << "Current Admin Info:";
    qDebug() << "AID:" << currentAdmin.aid;
    qDebug() << "Name:" << currentAdmin.aname;
    qDebug() << "Email:" << currentAdmin.email;
    // 不应该在日志中显示真实密码
    // qDebug() << "Password:" << currentAdmin.password;

    if (currentAdmin.aid.isEmpty()) {
        QMessageBox::warning(this, tr("警告"), tr("无法获取当前管理员信息，请重新登录！"));
        return;
    }

    // 创建 Dialog_password 对象并传递 currentAdmin 和 m_admSql
    Dialog_password* passwordDialog = new Dialog_password(currentAdmin, m_admSql, this);

    // 连接信号与槽
    connect(passwordDialog, &Dialog_password::adminInfoChanged, this, &MainWindow::onAdminInfoChanged);
    passwordDialog->exec();

    // 删除对话框
    delete passwordDialog;
}
void MainWindow::updateAdminInfoLabels(const AdmInfo &adminInfo)
{
    qDebug() << "Updating admin info labels with:" << adminInfo.aid << adminInfo.aname << adminInfo.email;
    ui->l_aid->setText(adminInfo.aid);
    ui->l_aname->setText(adminInfo.aname);
    ui->l_email->setText(adminInfo.email);
}
void MainWindow::onAdminInfoChanged(const AdmInfo &adminInfo)
{
    // 更新主窗口中的标签显示管理员信息
    updateAdminInfoLabels(adminInfo);

}
AdmInfo MainWindow::getCurrentAdmin() const
{
    AdmInfo currentAdmin;
    QString aidText = ui->l_aid->text().trimmed();

    if (!aidText.isEmpty()) {
        // 获取管理员信息
        currentAdmin = m_admSql->getAdminInfoByAid(aidText);
        if (currentAdmin.aid.isEmpty()) {
            qWarning() << "未能通过 AID 获取有效的管理员信息";
        }
    } else {
        qWarning() << "l_aid不是有效的管理员ID";
    }

    return currentAdmin;
}
void MainWindow::onHeaderSectionClicked(int logicalIndex)
{
    // 在 mainwindow.cpp 或其他适当的源文件中

    // 检查是否是可排序列
    if (sortableColumns.find(logicalIndex) == sortableColumns.end()) {
        return; // 如果不是可排序列，则直接返回不做任何处理
    }

    // 如果当前点击的列不是新点击的列，则重置当前列的状态
    if (currentSortedColumn != -1 && currentSortedColumn != logicalIndex) {
        clearSortIcon(currentSortedColumn);
    }

    // 切换排序顺序
    if (currentSortedColumn == logicalIndex) {
        sortOrder = (sortOrder == Qt::AscendingOrder) ? Qt::DescendingOrder : Qt::AscendingOrder;
    } else {
        sortOrder = Qt::AscendingOrder; // 默认升序
    }

    // 更新当前被选中的列
    currentSortedColumn = logicalIndex;

    // 动态构建排序字段名
    const QMap<int, QString> columnNames = {
        {1, "id"},
        {2, "sid"},
        {4, "age"},
        {5, "grade"},
        {6, "class"}
    };
    QString sortColumnName = columnNames.value(logicalIndex);

    // 通知模型重新加载数据并根据指定列进行排序
    reloadTableData(sortColumnName, sortOrder);

    // 根据排序顺序切换表头图标
    setSortIcon(logicalIndex, sortOrder);
}

void MainWindow::clearSortIcon(int logicalIndex)
{
    ui->tableWidget->horizontalHeaderItem(logicalIndex)->setIcon(QIcon());
}

void MainWindow::setSortIcon(int logicalIndex, Qt::SortOrder order)
{
    QString imagePath;
    if (order == Qt::AscendingOrder) {
        imagePath = ":/resource/down.png";
    } else {
        imagePath = ":/resource/up.png";
    }
    ui->tableWidget->horizontalHeaderItem(logicalIndex)->setIcon(QIcon(imagePath));
}
void MainWindow::reloadTableData(const QString& sortColumnName, Qt::SortOrder sortOrder)
{
    ui->tableWidget->verticalHeader()->setVisible(false);
    ui->tableWidget->clear();
    ui->tableWidget->setColumnCount(8);
    QStringList l;
    l<<"序号"<<"ID"<<"学号"<<"姓名"<<"年龄"<<"年级"<<"班级"<<"电话";
    ui->tableWidget->setHorizontalHeaderLabels(l);
    //只选中行
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
    // ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
    ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

    auto cnt=m_ptrStuSql->getStuCnt();
    ui->l_cnt->setText(QString("学生总数：%1").arg(cnt));
    // 构建 SQL 查询字符串，实现分页查询和排序
    QString orderClause = sortOrder == Qt::AscendingOrder ? "ASC" : "DESC";
    QString strsql = QString("SELECT * FROM student ORDER BY %1 %2 LIMIT %3 OFFSET %4;")
                         .arg(sortColumnName).arg(orderClause).arg(cnt).arg(0 * cnt);
    // 获取分页的学生信息
    QList<StuInfo> lstudents = m_ptrStuSql->getSortStu(0, cnt,strsql);
    ui->tableWidget->setRowCount(cnt);
    for(int i=0;i<lstudents.size();i++){
        ui->tableWidget->setItem(i,0,new QTableWidgetItem(QString::number(i)));
        ui->tableWidget->setItem(i,1,new QTableWidgetItem(QString::number(lstudents[i].id)));
        ui->tableWidget->setItem(i,2,new QTableWidgetItem(lstudents[i].sid));
        ui->tableWidget->setItem(i,3,new QTableWidgetItem(lstudents[i].sname));
        ui->tableWidget->setItem(i,4,new QTableWidgetItem(QString::number(lstudents[i].age)));
        ui->tableWidget->setItem(i,5,new QTableWidgetItem(QString::number(lstudents[i].grade)));
        ui->tableWidget->setItem(i,6,new QTableWidgetItem(QString::number(lstudents[i].sclass)));
        ui->tableWidget->setItem(i,7,new QTableWidgetItem(lstudents[i].phone));
    }
    if (ui->cb_select->checkState() == Qt::Checked) {
        ui->cb_select->setCheckState(Qt::Unchecked);
    }
}
void MainWindow::updateRowNumbers()
{
    for (int row = 0; row < ui->tableWidget->rowCount(); ++row) {
        QTableWidgetItem* item = new QTableWidgetItem(QString::number(row + 1)); // 行号从1开始
        ui->tableWidget->setItem(row, 0, item); // 假设第一列是行号列
    }
}




